layui.use(['form', 'table', 'eleTree'], function () {
    var $ = layui.jquery,
        form = layui.form,
        table = layui.table;
    var eleTree = layui.eleTree;
    loadData(table);

    // 监听搜索操作
    form.on('submit(data-search-btn)', function (data) {
        //执行搜索重载
        table.reload('currentTableIdRoleList', {
            page: {curr: 1},//重新从第 1 页开始
            where: data.field
        });

        return false;
    });

    /**
     * toolbar监听事件
     */
    table.on('toolbar(currentTableFilter)', function (obj) {
        if (obj.event === 'addRole') {  // 监听添加操作
            addRole(table);
        }

        if (obj.event === 'editRole') {  // 监听修改操作
            if (init_update_form(table)) {
                editRole(table);
            }
        }

        if (obj.event === 'deleteRole') {  // 监听删除操作
            deleteRole(table);
        }
    });

    //监听表格复选框选择
    table.on('checkbox(currentTableFilter)', function (obj) {
        var cacheElement = table.cache['currentTableIdRoleList'];
        tableCheckBoxOnly(obj, cacheElement);
    });

    //编辑角色
    table.on('tool(currentTableFilter)', function (obj) {
        if (obj.event === 'addResource') {
            editRoleResource(obj, eleTree);
        }
    });
});

function editRoleResource(obj, eleTree) {
    $("#resource_tree").html("");
    var data = obj.data;
    const dataFormValue = 'roleId=' + parseInt(data.id);
    var roleTree = JSONAuthAjax(dl_coder_url.get_role_menu[0], dl_coder_url.get_role_menu[1], dataFormValue);
    if (roleTree.code === '200') {

        var tree = eleTree({
            el: "#resource_tree",                   // dom选择器
            data: roleTree.data,                   // 静态数据
            emptText: "暂无数据",        // 内容为空的时候展示的文本
            highlightCurrent: false,    // 是否高亮当前选中节点，默认值是 false。
            highlightNode: "",          // 初始高亮选中的key
            defaultExpandAll: false,    // 是否默认展开所有节点
            expandOnClickNode: true,    // 是否在点击文本的时候展开或者收缩节点， 默认值为 true，如果为 false，则只有点箭头图标的时候才会展开或者收缩节点。
            checkOnClickNode: false,    // 复选框是否在点击文本的时候选中节点，默认值为 false，即只有在点击复选框时才会选中节点。
            radioOnClickNode: false,    // 单选框是否在点击文本的时候选中节点，默认值为 false，即只有在点击单选框时才会选中节点。
            defaultExpandedKeys: [],    // 默认展开的节点的 key 的数组
            autoExpandParent: false,     // 展开子节点的时候是否自动展开父节点
            showCheckbox: true,        // 节点是否可被选择
            checkStrictly: false,       // 在显示复选框的情况下，是否严格的遵循父子不互相关联的做法，默认为 false
            isDefaultChangePstatus: true,      // 在父子关联的情况下，初始数据是否只是子节点影响父节点，即父节点选中，子节点全部没有选中或部分选中，则让父节点也没有选中或者半选，默认false，即父子结点互相影响
            defaultCheckedKeys: [],     // 默认勾选的节点的 key 的数组
            accordion: false,           // 是否每次只打开一个同级树节点展开（手风琴效果）
            indent: 16,                 // 相邻级节点间的水平缩进，单位为像素
            lazy: false,                // 当不是懒加载时，叶子节点由当前节点是否由子节点判断，如果为懒加载，则叶子节点由当前节点的属性isLeaf: true决定
            load: function () {
            },        // 加载子树数据的方法，仅当 lazy 属性为true 时生效
            draggable: false,           // 是否开启拖拽节点功能
            searchNodeMethod: null,     // 对树节点进行筛选时执行的方法，返回 true 表示这个节点可以显示，返回 false 则表示这个节点会被隐藏
            showLine: true,             // 是否显示连线，默认true
            imgUrl: "./images/",        // 图片所在的文件夹路径
            iconItem: null,             // 自定义图标(单独设置某一个节点)
            rightMenuList: [],          // 右键菜单("copy", "paste", "paste_before", "paste_after", "cut_paste", "edit", "remove", "add_child", "add_before", "add_after")
            done: null,         // 树渲染完成之后的回调
            showRadio: false,               // 是否显示radio
            radioType: "level", // all      // 单选范围（是同一级还是整体只能选择一个）
            isOnlyShowLeafRadio: false,     // 是否只显示叶子节点的radio
            defaultRadioCheckedKeys: [],    // radio默认选中项
            customText: null,               // 节点文本自定义函数
            defaultPid: "",     // 第一层pid的初始值
            request: {          // 对于后台数据重新定义名字
                name: "title",
                key: "id",
                children: "children",
                checked: "checked",
                pid: "parentId",
            },
            sort: false,            // 是否开启排序，开启则使用initSort参数（对于懒加载，如果开启排序，并且不传深度，则执行排序，如果传深度，需要手动执行sort方法）
            initSort: {
                id: null,           // 对某一个节点排序, 不传则对最外层节点
                field: "label",     // 按某个字段排序
                type: "asc",        // asc:升序, desc:降序
                depth: null,        // 深度，不传则为最深层，支持数字，1/2/3
            }
        })

        //打开树弹出框
        openResourceTree(tree, data.id);
    }
}

function addRole(table) {
    $("#roleNmae").val("");
    $("#roleId").val("");
    layer.open({
        type: 1,
        title: "新增权限",
        area: ['50%', '50%'],
        btn: ['确定', '取消'],
        content: $('#role-update-add-from'),
        yes: function (index, layero) {
            layui.use(['form'], function () {
                const form = layui.form;
                roleFormValue(form, index, '1', table);
            });
        }
    });
}

function deleteRole(table) {
    var selectdata = table.checkStatus('currentTableIdRoleList').data;
    if (selectdata.length === 0) {
        lay_tishi("选择一条数据");
        return false;
    }
    if (selectdata.length > 1) {
        lay_tishi("有多条数据");
        return false;
    }
    layer.confirm('确认删除', function (index) {
        var param = "roleId=" + selectdata[0].id;
        var resultData = JSONAuthAjax(dl_coder_url.delete_role[0], dl_coder_url.delete_role[1], param);

        if (resultData.code === '200') {
            loadData(table);
            layer.close(index);
        }
    });
}

function editRole(table) {
    layer.open({
        type: 1,
        title: "修改权限",
        area: ['50%', '50%'],
        btn: ['确定', '取消'],
        content: $('#role-update-add-from'),
        yes: function (index, layero) {
            layui.use(['form'], function () {
                const form = layui.form;
                roleFormValue(form, index, '1', table);
            });
        }
    });
}

function init_update_form(table) {
    var selectdata = table.checkStatus('currentTableIdRoleList').data;
    if (selectdata === null || selectdata.length === 0) {
        lay_tishi("选择一条数据");
        return false;
    }
    if (selectdata.length > 1) {
        lay_tishi("有多条数据");
        return false;
    }

    $("#roleNmae").val(selectdata[0].roleName);
    $("#roleId").val(selectdata[0].id);
    $("#isStatus").val(selectdata[0].roleStatus);
    layer.open({
        type: 1,
        title: "修改权限",
        area: ['50%', '50%'],
        btn: ['确定', '取消'],
        content: $('#role-update-add-from'),
        yes: function (index, layero) {
            layui.use(['form'], function () {
                const form = layui.form;
                roleFormValue(form, index, '2', table);
            });
        }
    });
}

function roleFormValue(form, index, type, table) {
    form.render();
    if (!form.validate('#role-update-add-from')) {
        lay_msg("角色名不能为空");
        return false;
    }
    const roleId = $("#roleId").val() == null ? null : parseInt($("#roleId").val());
    const dataFormValue = {'roleName': $("#roleNmae").val(), 'roleId': roleId, 'roleStatus': $("#roleStatus").val()};
    var resultData;
    //新增
    if (type === "1") {
        resultData = JSONAuthAjax(dl_coder_url.add_role[0], dl_coder_url.add_role[1], dataFormValue);
    } else {
        //修改
        resultData = JSONAuthAjax(dl_coder_url.update_role[0], dl_coder_url.update_role[1], dataFormValue);
    }
    if (resultData.code === '200') {
        loadData(table);
        layer.close(index);
    }
}

function openResourceTree(tree, roleId) {
    layer.open({
        title: '添加权限用户',
        type: 1,
        area: ['20%', '50%'],
        btn: ['确定', '取消'],
        content: $('#resource_tree'),
        yes: function (index, layero) {
            const layTreeCheckedId = getEleTreeCheckedId(tree.getChecked());
            const data = {"roleId": roleId, "menuIds": layTreeCheckedId}
            var jsonAuthAjax = JSONAuthAjax(dl_coder_url.save_role_menu[0], dl_coder_url.save_role_menu[1], data);
            if (jsonAuthAjax.code === '200') {
                layer.close(index);
            }
        }
    });
}

function loadData(table, where) {
    table.render({
        elem: '#currentTableIdRoleList',
        url: dl_coder_url.system_role[0],
        toolbar: '#toolbarDemo',
        method: dl_coder_url.system_role[1],
        where: where,
        contentType: 'application/json',
        dataType: 'json',
        request: {
            pageName: 'pageNo', //页码的参数名称，默认：page
            limitName: 'pageSize', //每页数据量的参数名，默认：limit
        },
        headers: headerMap,
        defaultToolbar: ['filter', 'exports', 'print', {
            title: '提示',
            layEvent: 'LAYTABLE_TIPS',
            icon: 'layui-icon-tips'
        }],
        parseData: function (res) { //res 即为原始返回的数据
            return {
                "code": res.code, //解析接口状态
                "msg": res.msg, //解析提示文本
                "total": res.data.total, //解析数据长度
                "data": res.data.records, //解析数据列表
                "count": res.data.total, //解析数据长度
            }
        },
        response: {
            statusName: 'code', //规定数据状态的字段名称，默认：code
            statusCode: 200,//规定成功的状态码，默认：0
            msgName: 'msg', //规定状态信息的字段名称，默认：msg
            countName: 'total', //规定数据总数的字段名称，默认：count
            dataName: 'data', //规定数据列表的字段名称，默认：data
        },
        cols: [[
            {type: "checkbox", width: 50},
            {field: 'id', width: 80, title: 'ID', sort: true},
            {field: 'roleName', width: 200, title: '角色名'},
            {field: 'roleStatus', hide: true, width: 80, title: '状态', sort: true},
            {
                field: 'roleStatusName', title: '状态', width: 80, templet:
                    function (data) {
                        if (data.roleStatus === '1') return '启用';
                        else if (data.roleStatus === '2') return '禁用';
                        else return '禁用';
                    }
            },
            {field: 'createTime', width: 300, title: '创建时间'},
            {field: 'updateTime', title: '修改时间', minWidth: 300},
            {title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"}
        ]],
        limits: [10, 15, 20, 25, 50, 100],
        limit: 15,
        page: true,
        skin: 'line',
        even: true,
        size: 'sm',
        height: 'full-110' //高度最大化减去差值
    });
}